A storage server is a computer system and a form of storage controller that is used to store and retrieve data on behalf of one or more clients on a network. A storage server operates on behalf of one or more clients to store and manage data in a set of mass storage devices, such as magnetic or optical storage-based disks or tapes. A storage server may be configured to service file-level requests from clients, as in the case of file servers used in a Network Attached Storage (NAS) environment. Alternatively, a storage server may be configured to service block-level requests from clients, as done by storage servers used in a Storage Area Network (SAN) environment. Further, some storage servers are capable of servicing both file-level and block-level requests, such as certain storage servers made by NetApp®, Inc. of Sunnyvale, Calif.
A storage server often allocates cache memory or interacts with a separate cache server to speed up the retrieval of data stored in the server's mass storage devices. Retrieving data from the cache memory of the storage server is faster and more efficient than retrieving the same data repeatedly from the mass storage devices, which have higher latency than the cache memory. However, the cache memory is usually volatile, and has less storage capacity than the mass storage devices. Once the cache memory becomes full, some of the old cached data need to be removed in order to create space for the newly requested data. Thus, the performance of a cache memory depends on how to keep the frequently requested data in the cache memory for as long as possible. For example, certain cache replacement policies rotate out the least accessed data in the memory to make space for the newly requested data. Other cache replacement approaches may discard data based on the last time the data is requested. Thus, the performance of a cache memory largely depends on which of these cache replacement policies is implemented.
The performance of a cache memory also depends on the cache memory capacity and how data stored in the storage server is used by different applications. For example, an airline flight reservation system may generate a large amount of short and concurrent data storage transactions, while a reservation reporting system may summarize a large quantity of storage data in a long and single storage transaction. A cache policy based on the frequency of the data being accessed may be suitable for one type of application, but may hinder the performance of another type. Since no single cache configuration can satisfy all types of storage usage, the capacity or the cache policy of a cache memory need to be frequently evaluated to make sure it is appropriate for the type of usage the storage server is currently experiencing.
However, it is often impractical to predict what kind of data access pattern the storage server will encounter. Also, it is hard to evaluate the performance of a cache memory under its existing cache policy when there is no alternative with which to compare it. Even if an ideal cache policy is implemented, there is no indicator to show that this particular cache policy performs better than any other alternatives. When a performance enhancement cannot be demonstrated, a storage server administrator may be less inclined to invest in additional cache memory or to change the cache memory to a different caching configuration. Thus, selecting a cache configuration for a cache memory becomes a “hit or miss” estimation. Further, it is impractical to simultaneously implement multiple cache memories in the same storage server in order to experiment these different alternatives. Such an approach is wasteful of precious memory resources.